	

    import java.io.File;
    import java.io.IOException;
import java.net.Socket;
import java.util.Iterator;
import java.util.LinkedList;
     
    public class Serwer {
     
            private Connection conn;
        private ConnectionWriter writer;
        private ConnectionReader reader;
        int port ;
        private Obslugapliku plik ;
        private File[] pliki ;
        int i = 0 ; //licznik do porownywania plikow
        private void netInit() {
            try {
             conn= new Connection(new Socket("localhost", 5000));
             writer = new ConnectionWriter(conn);
             writer.start();
             
             Message m = new Message() ;
                     m.setCommand("REGISTER") ;
                     m.setType(1) ;
                     m.setSender(port) ;
                     m.setObciazenie(plik.obciazenieSerwera()) ;
                     writer.addToQueue(m) ;
     
             reader = new ConnectionReader(conn,this);
             reader.start();
             
            }
             
            catch(Exception e) {
                    System.out.println(e.getMessage());
                    }
           
           
        }
            private String pobierzNowaWartosc(int port,int key)
            {
                    Klientobsluga a = new Klientobsluga(port) ;
                    Message m = new Message();
                    m.setKey(key);
                    m.setType(1);
                    a.sendMessage(m);
                    String value = null;
                    m = a.getMessage();    //zwraca wiadomosc ze wykonano
                    if(m != null)
                    	value = m.getCommand();
                    a.connectionClose() ;
                    return value;
               
            }
            protected void handleMessage(Message m) throws IOException {
                   
                    System.out.println("Przetwarzanie wiadomosci od LOAD BALANCERA " +m.getCommand()) ;
                    if(m.getType() == 8)
                    {
                            if(Integer.parseInt(m.getCommand()) == 2)//zmodyfikuj plik
                            {  
                            		LinkedList<Integer> porty = m.getPorty();
                            		Iterator<Integer> iter = porty.iterator();
                            		while(iter.hasNext())//proboje pobrac nowa wartosc z ktoregos z serwerow
                            		{
                            			String wartosc = pobierzNowaWartosc(iter.next(),m.getKey()) ;
                                        try {
                                                plik.piszLinie(Integer.toString(m.getKey()), wartosc) ;
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        
                                        if(wartosc != null)//poszlo ok
                                        {
                                        	Message m2 = new Message() ;
                            				m2.setType(5) ;//dodano plik
                            				m2.setKey(m.getKey()) ;
                            				m2.setObciazenie(plik.obciazenieSerwera()) ;
                            				m2.setCommand(plik.dajSumeKontrolna(Integer.toString(m.getKey()))) ;
                            				m2.setSender(port) ;
                            				writer.addToQueue(m2) ;
                            				break ;
                                        }
                                        	
                            		}
                                    
                            }else if(Integer.parseInt(m.getCommand()) == 3)//usun plik
                            {  
                            	System.out.println("Usuwam plik") ;
                                
                        		try {
									plik.usunPlik(Integer.toString(m.getKey())) ;
								} catch (IOException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
                                
                            }
                            
                            if(i < pliki.length)
                            {
                                     Message m2 = new Message() ;
                             String sumaKontrolna = null;
                                    try {
                                            sumaKontrolna = plik.dajSumeKontrolna(pliki[i].getName());
                                    } catch (IOException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                    }
                             m2.setCommand(sumaKontrolna) ;
                             m2.setType(8);//porownanie sum kontrolnych plikow
                             m2.setKey(Integer.parseInt(pliki[i].getName())) ;
                             m2.setSender(port) ;
                             writer.addToQueue(m2) ;
                             ++i ; //przy handle message poprosze o porownanie kolejnego pliku
                            }
                            if(i == pliki.length)
                            {
                                   
                            }
                    }
                   
                   
            }
           
            synchronized public void sendMessageToLB(Message m) {
                   
                    writer.addToQueue(m) ;
            }
            public Obslugapliku getPlik(){
                    return plik ;
            }
            
            public void zamknijPisarza()
            {
            	Message m = new Message() ;
            	m.setCommand("WRITER_END") ;
            	writer.addToQueue(m) ;
            	restart() ;
            }
            
            
            void restart()
            {
            	while(true)
            	{
            		try {
                        conn= new Connection(new Socket("localhost", 5000));
                        writer = new ConnectionWriter(conn);
                        writer.start();
                        
                        Message m = new Message() ;
                                m.setCommand("REGISTER") ;
                                m.setType(1) ;
                                m.setSender(port) ;
                                m.setObciazenie(plik.obciazenieSerwera()) ;
                                writer.addToQueue(m) ;
                
                        reader = new ConnectionReader(conn,this);
                        reader.start();
                        break ;
                       }
                        
                       catch(Exception e) {
                              //System.out.println(e.getMessage());
                    	   System.out.println("Nie moge sie polaczyc z LB") ;
                    	   try {
							Thread.sleep(5000) ;
						} catch (InterruptedException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
                       }
            	}
            	
            	i = 0 ;
            	pliki = plik.listaPlikow() ;
                if(pliki.length > 0)
                {
                        Message m2 = new Message() ;
                    String sumaKontrolna = new String();
                        try {
                                sumaKontrolna = plik.dajSumeKontrolna(pliki[0].getName());
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                    m2.setCommand(sumaKontrolna) ;
                    m2.setType(8);//porownanie sum kontrolnych plikow
                    m2.setKey(Integer.parseInt(pliki[0].getName())) ;
                    m2.setSender(port) ;
                    writer.addToQueue(m2) ;
                    ++i ; //przy handle message poprosze o porownanie kolejnego pliku
                }
            	
            }
            public Serwer(int p)
            {
                    port = p ;
                    plik = new Obslugapliku(port) ;
                    netInit() ;
                   
                    //teraz musze porownac wszystkie sumy kontrolne
            pliki = plik.listaPlikow() ;
            if(pliki.length > 0)
            {
                    Message m2 = new Message() ;
                String sumaKontrolna = new String();
                    try {
                            sumaKontrolna = plik.dajSumeKontrolna(pliki[0].getName());
                    } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                    }
                m2.setCommand(sumaKontrolna) ;
                m2.setType(8);//porownanie sum kontrolnych plikow
                m2.setKey(Integer.parseInt(pliki[0].getName())) ;
                m2.setSender(port) ;
                writer.addToQueue(m2) ;
                ++i ; //przy handle message poprosze o porownanie kolejnego pliku
            }
           
            }
    }

